"""
活动连续性检查模块
用于检查活动安排的连续性，确保活动安排符合老人的生活规律
"""


class ActivityContinuityChecker:
    """活动连续性检查器"""

    def __init__(self):
        """初始化活动连续性检查器"""
        # 定义活动类型
        self.SLEEP = "sleep"
        self.MEAL = "meal"
        self.HYGIENE = "hygiene"
        self.MEDICAL = "medical"
        self.REHABILITATION = "rehabilitation"
        self.SOCIAL = "social"
        self.ENTERTAINMENT = "entertainment"
        self.OTHER = "other"

        # 定义活动连续性规则
        # 格式: {前一个活动类型: [适合作为后续活动的类型列表]}
        self.continuity_rules = {
            self.SLEEP: [
                self.HYGIENE,
                self.MEAL,
                self.MEDICAL,
            ],  # 睡眠后适合洗漱、用餐或医疗检查
            self.MEAL: [
                self.HYGIENE,
                self.SLEEP,
                self.SOCIAL,
                self.ENTERTAINMENT,
            ],  # 用餐后适合洗漱、休息或社交活动
            self.HYGIENE: [
                self.MEAL,
                self.SLEEP,
                self.SOCIAL,
                self.REHABILITATION,
            ],  # 洗漱后适合用餐、休息或康复训练
            self.MEDICAL: [
                self.SLEEP,
                self.MEAL,
                self.HYGIENE,
            ],  # 医疗活动后适合休息、用餐或洗漱
            self.REHABILITATION: [
                self.SLEEP,
                self.MEAL,
                self.HYGIENE,
            ],  # 康复训练后适合休息、用餐或洗漱
            self.SOCIAL: [
                self.MEAL,
                self.ENTERTAINMENT,
                self.SLEEP,
            ],  # 社交活动后适合用餐、娱乐或休息
            self.ENTERTAINMENT: [
                self.MEAL,
                self.SOCIAL,
                self.SLEEP,
            ],  # 娱乐活动后适合用餐、社交或休息
        }

        # 定义活动ID到活动类型的映射
        self.activity_type_map = {
            # 睡眠活动
            10: self.SLEEP,  # 睡眠
            # 用餐活动
            8: self.MEAL,  # 饮食
            64: self.MEAL,  # 协助老年人进食
            65: self.MEAL,  # 协助老年人饮水
            66: self.MEAL,  # 协助老年人进食
            # 洗漱活动
            95: self.HYGIENE,  # 为老年人更换被服
            97: self.HYGIENE,  # 协助老年人更换衣服
            98: self.HYGIENE,  # 协助老年人更换开襟衣服
            100: self.HYGIENE,  # 协助老年人更换鞋袜
            101: self.HYGIENE,  # 协助老年人刷牙
            106: self.HYGIENE,  # 为老年人晨间梳洗
            108: self.HYGIENE,  # 协助老年人洗脸
            111: self.HYGIENE,  # 协助老年人洗头
            112: self.HYGIENE,  # 协助老年人淋浴
            113: self.HYGIENE,  # 协助老年人盆浴
            114: self.HYGIENE,  # 为老年人床上擦浴
            # 医疗活动
            69: self.MEDICAL,  # 救助噎食、误吸的老年人
            70: self.MEDICAL,  # 救助窒息的老年人
            71: self.MEDICAL,  # 救助心脏骤停的老年人
            72: self.MEDICAL,  # 救助休克的老年人
            73: self.MEDICAL,  # 救助昏迷的老年人
            85: self.MEDICAL,  # 为有肠造瘘的老年人更换粪袋
            # 康复活动
            154: self.REHABILITATION,  # 教老年人使用健身器材
            155: self.REHABILITATION,  # 帮助老年人从仰卧位至侧卧位的体位转换
            156: self.REHABILITATION,  # 帮助老年人从仰卧位至坐位的体位转换
            157: self.REHABILITATION,  # 帮助老年人从仰卧位至床边坐起的体位转换
            158: self.REHABILITATION,  # 辅导老年人完成健身康复操
            159: self.REHABILITATION,  # 带领智力障碍老年人进行康复训练
            160: self.REHABILITATION,  # 教老年人使用拐杖进行活动
            161: self.REHABILITATION,  # 教老年人使用轮椅进行活动
            162: self.REHABILITATION,  # 使用平车转运老年人
            163: self.REHABILITATION,  # 帮助老年人进行穿脱衣服训练
            164: self.REHABILITATION,  # 帮助老年人进行站立、行走等活动
            165: self.REHABILITATION,  # 帮助肢体障碍老年人进行功能训练
            166: self.REHABILITATION,  # 帮助压力性尿失禁老年人进行功能训练
            # 社交活动
            167: self.SOCIAL,  # 指定老年人个体心理辅导方案
            168: self.SOCIAL,  # 指定老年人团体心理辅导方案
            169: self.SOCIAL,  # 用讲解法为老年人讲解心理健康知识
            170: self.SOCIAL,  # 用讨论法为老年人讲解心理健康知识
            171: self.SOCIAL,  # 用角色扮演法为老年人讲解心理健康知识
            172: self.SOCIAL,  # 识别老年人的抑郁情绪及其原因
            173: self.SOCIAL,  # 识别老年痴呆症
            174: self.SOCIAL,  # 用语言和肢体语言疏导老年人不良情绪
            175: self.SOCIAL,  # 合理情绪法
        }

    def get_activity_type(self, activity_id):
        """获取活动类型

        Args:
            activity_id: 活动ID

        Returns:
            活动类型
        """
        # 尝试转换为整数
        try:
            activity_id = int(activity_id)
        except (ValueError, TypeError):
            pass

        # 从映射中获取活动类型
        return self.activity_type_map.get(activity_id, self.OTHER)

    def check_continuity(self, prev_activity_id, curr_activity_id):
        """检查活动连续性

        Args:
            prev_activity_id: 前一个活动ID
            curr_activity_id: 当前活动ID

        Returns:
            布尔值，表示活动连续性是否合理
        """
        # 获取活动类型
        prev_type = self.get_activity_type(prev_activity_id)
        curr_type = self.get_activity_type(curr_activity_id)

        # 如果前一个活动类型不在规则中，认为连续性合理
        if prev_type not in self.continuity_rules:
            return True

        # 检查当前活动类型是否在前一个活动类型的适合后续活动列表中
        return curr_type in self.continuity_rules.get(prev_type, [])

    def suggest_next_activity(self, prev_activity_id, available_activities):
        """根据前一个活动建议下一个活动

        Args:
            prev_activity_id: 前一个活动ID
            available_activities: 可用的活动ID列表

        Returns:
            建议的下一个活动ID，如果没有合适的活动则返回None
        """
        # 获取前一个活动类型
        prev_type = self.get_activity_type(prev_activity_id)

        # 如果前一个活动类型不在规则中，返回第一个可用活动
        if prev_type not in self.continuity_rules:
            return available_activities[0] if available_activities else None

        # 获取适合作为后续活动的类型列表
        suitable_types = self.continuity_rules.get(prev_type, [])

        # 从可用活动中筛选出适合作为后续活动的活动
        suitable_activities = []
        for activity_id in available_activities:
            curr_type = self.get_activity_type(activity_id)
            if curr_type in suitable_types:
                suitable_activities.append(activity_id)

        # 如果有适合的活动，返回第一个
        if suitable_activities:
            return suitable_activities[0]

        # 如果没有适合的活动，返回第一个可用活动
        return available_activities[0] if available_activities else None
